package com.ruoyi.device.service.impl;

import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.device.domain.DeviceInfo;
import com.ruoyi.device.mapper.DeviceCategoryMapper;
import com.ruoyi.device.domain.DeviceCategory;
import com.ruoyi.device.service.IDeviceCategoryService;
import com.ruoyi.device.mapper.DeviceInfoMapper;
import com.ruoyi.fault.domain.FaultReport;

/**
 * 设备分类Service业务层处理
 *
 * @author silence
 * @date 2025-07-19
 */
@Service
public class DeviceCategoryServiceImpl implements IDeviceCategoryService
{
    @Autowired
    private DeviceCategoryMapper deviceCategoryMapper;

    @Autowired
    private DeviceInfoMapper deviceInfoMapper;

    /**
     * 查询设备分类
     *
     * @param id 设备分类主键
     * @return 设备分类
     */
    @Override
    public DeviceCategory selectDeviceCategoryById(Long id)
    {
        return deviceCategoryMapper.selectDeviceCategoryById(id);
    }

    /**
     * 查询设备分类列表
     *
     * @param deviceCategory 设备分类
     * @return 设备分类
     */
    @Override
    public List<DeviceCategory> selectDeviceCategoryList(DeviceCategory deviceCategory)
    {
        return deviceCategoryMapper.selectDeviceCategoryList(deviceCategory);
    }

    /**
     * 新增设备分类
     *
     * @param deviceCategory 设备分类
     * @return 结果
     */
    @Transactional
    @Override
    public int insertDeviceCategory(DeviceCategory deviceCategory)
    {
        deviceCategory.setCreateTime(DateUtils.getNowDate());
        int rows = deviceCategoryMapper.insertDeviceCategory(deviceCategory);
        insertDeviceInfo(deviceCategory);
        return rows;
    }

    /**
     * 修改设备分类
     * 【核心修改：处理外键约束】
     * @param deviceCategory 设备分类
     * @return 结果
     */
    @Transactional
    @Override
    public int updateDeviceCategory(DeviceCategory deviceCategory)
    {
        deviceCategory.setUpdateTime(DateUtils.getNowDate());

        // 步骤 1: 根据 categoryId 找出该类别下所有现有的 device_info 的 id
        List<Long> existingDeviceIdsList = deviceInfoMapper.selectDeviceIdsByCategoryIds(new Long[]{deviceCategory.getId()});

        if (existingDeviceIdsList != null && !existingDeviceIdsList.isEmpty()) {
            Long[] existingDeviceIdsArray = existingDeviceIdsList.toArray(new Long[0]);

            // 步骤 2: 根据 device_info 的 id 找出所有关联的 fault_report 的 id
            List<Long> faultReportIdsList = deviceInfoMapper.selectFaultReportIdsByDeviceIds(existingDeviceIdsArray);

            if (faultReportIdsList != null && !faultReportIdsList.isEmpty()) {
                Long[] faultReportIdsArray = faultReportIdsList.toArray(new Long[0]);

                // 步骤 3: 根据 fault_report 的 id 找出所有关联的 fault_repair 的 id
                List<Long> faultRepairIdsList = deviceInfoMapper.selectFaultRepairIdsByReportIds(faultReportIdsArray);

                // 步骤 4: 如果存在关联的 fault_repair，则先删除这些 fault_repair 关联的 fault_assign 记录
                if (faultRepairIdsList != null && !faultRepairIdsList.isEmpty()) {
                    Long[] faultRepairIdsArray = faultRepairIdsList.toArray(new Long[0]);
                    deviceInfoMapper.deleteFaultAssignByRepairIds(faultRepairIdsArray); // 删除 fault_assign 记录
                }

                // 步骤 5: 删除 fault_report 关联的 fault_repair 记录
                deviceInfoMapper.deleteFaultRepairByReportIds(faultReportIdsArray);
            }

            // 步骤 6: 删除 device_info 关联的 fault_report 记录
            deviceInfoMapper.deleteFaultReportByDeviceIds(existingDeviceIdsArray);
        }

        // 步骤 7: 删除 device_info 记录 (清理旧的设备信息)
        deviceCategoryMapper.deleteDeviceInfoByCategoryId(deviceCategory.getId());

        // 步骤 8: 更新设备分类主表记录
        int rows = deviceCategoryMapper.updateDeviceCategory(deviceCategory);

        // 步骤 9: 插入新的设备基本信息（如果传入的 deviceCategory 包含新的DeviceInfo列表）
        insertDeviceInfo(deviceCategory);

        return rows;
    }

    /**
     * 批量删除设备分类
     * 【核心修改：处理外键约束】
     * @param ids 需要删除的设备分类主键
     * @return 结果
     */
    @Transactional // 确保整个删除过程在事务中，保证数据一致性
    @Override
    public int deleteDeviceCategoryByIds(Long[] ids)
    {
        // 步骤 1: 根据 categoryIds 找出所有关联的 device_info 的 id
        List<Long> deviceIdsList = deviceInfoMapper.selectDeviceIdsByCategoryIds(ids);

        if (deviceIdsList != null && !deviceIdsList.isEmpty()) {
            Long[] deviceIdsArray = deviceIdsList.toArray(new Long[0]);

            // 步骤 2: 根据 device_info 的 id 找出所有关联的 fault_report 的 id
            List<Long> faultReportIdsList = deviceInfoMapper.selectFaultReportIdsByDeviceIds(deviceIdsArray);

            if (faultReportIdsList != null && !faultReportIdsList.isEmpty()) {
                Long[] faultReportIdsArray = faultReportIdsList.toArray(new Long[0]);

                // 步骤 3: 根据 fault_report 的 id 找出所有关联的 fault_repair 的 id
                List<Long> faultRepairIdsList = deviceInfoMapper.selectFaultRepairIdsByReportIds(faultReportIdsArray);

                // 步骤 4: 如果存在关联的 fault_repair，则先删除这些 fault_repair 关联的 fault_assign 记录
                if (faultRepairIdsList != null && !faultRepairIdsList.isEmpty()) {
                    Long[] faultRepairIdsArray = faultRepairIdsList.toArray(new Long[0]);
                    deviceInfoMapper.deleteFaultAssignByRepairIds(faultRepairIdsArray); // 删除 fault_assign 记录
                }

                // 步骤 5: 删除 fault_report 关联的 fault_repair 记录
                deviceInfoMapper.deleteFaultRepairByReportIds(faultReportIdsArray);
            }

            // 步骤 6: 删除 device_info 关联的 fault_report 记录
            deviceInfoMapper.deleteFaultReportByDeviceIds(deviceIdsArray);

            // 步骤 7: 删除 device_info 记录
            deviceCategoryMapper.deleteDeviceInfoByCategoryIds(ids);
        }

        // 步骤 8: 最后，删除 device_category 记录
        return deviceCategoryMapper.deleteDeviceCategoryByIds(ids);
    }

    /**
     * 删除设备分类信息 (单个删除逻辑)
     * 【核心修改：处理外键约束】
     * @param id 设备分类主键
     * @return 结果
     */
    @Transactional // 确保整个删除过程在事务中
    @Override
    public int deleteDeviceCategoryById(Long id)
    {
        // 步骤 1: 根据 categoryId 找出所有关联的 device_info 的 id
        // 将单个 id 放入数组，以复用批量查询方法
        List<Long> deviceIdsList = deviceInfoMapper.selectDeviceIdsByCategoryIds(new Long[]{id});

        if (deviceIdsList != null && !deviceIdsList.isEmpty()) {
            Long[] deviceIdsArray = deviceIdsList.toArray(new Long[0]);

            // 步骤 2: 根据 device_info 的 id 找出所有关联的 fault_report 的 id
            List<Long> faultReportIdsList = deviceInfoMapper.selectFaultReportIdsByDeviceIds(deviceIdsArray);

            if (faultReportIdsList != null && !faultReportIdsList.isEmpty()) {
                Long[] faultReportIdsArray = faultReportIdsList.toArray(new Long[0]);

                // 步骤 3: 根据 fault_report 的 id 找出所有关联的 fault_repair 的 id
                List<Long> faultRepairIdsList = deviceInfoMapper.selectFaultRepairIdsByReportIds(faultReportIdsArray);

                // 步骤 4: 如果存在关联的 fault_repair，则先删除这些 fault_repair 关联的 fault_assign 记录
                if (faultRepairIdsList != null && !faultRepairIdsList.isEmpty()) {
                    Long[] faultRepairIdsArray = faultRepairIdsList.toArray(new Long[0]);
                    deviceInfoMapper.deleteFaultAssignByRepairIds(faultRepairIdsArray); // 删除 fault_assign 记录
                }

                // 步骤 5: 删除 fault_report 关联的 fault_repair 记录
                deviceInfoMapper.deleteFaultRepairByReportIds(faultReportIdsArray);
            }

            // 步骤 6: 删除 device_info 关联的 fault_report 记录
            deviceInfoMapper.deleteFaultReportByDeviceIds(deviceIdsArray);

            // 步骤 7: 删除 device_info 记录
            deviceCategoryMapper.deleteDeviceInfoByCategoryId(id);
        }

        // 步骤 8: 最后，删除 device_category 记录
        return deviceCategoryMapper.deleteDeviceCategoryById(id);
    }

    /**
     * 新增设备基本信息信息
     *
     * @param deviceCategory 设备分类对象
     */
    public void insertDeviceInfo(DeviceCategory deviceCategory)
    {
        List<DeviceInfo> deviceInfoList = deviceCategory.getDeviceInfoList();
        Long id = deviceCategory.getId();
        if (StringUtils.isNotNull(deviceInfoList))
        {
            List<DeviceInfo> list = new ArrayList<DeviceInfo>();
            for (DeviceInfo deviceInfo : deviceInfoList)
            {
                deviceInfo.setCategoryId(id);
                list.add(deviceInfo);
            }
            if (list.size() > 0)
            {
                // 注意：这里需要确保 batchDeviceInfo 是在 DeviceCategoryMapper 中的
                // 常见情况是批处理插入方法也命名为 batchInsertXXX
                deviceCategoryMapper.batchDeviceInfo(list);
            }
        }
    }
}
